<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="UxORi" id="UxORi"><span data-lake-id="udeb21a6f" id="udeb21a6f">典型回答</span></h1>
  <p data-lake-id="u148761ff" id="u148761ff"><span data-lake-id="u955b8542" id="u955b8542">ZooKeeper作为分布式协调服务，它的职责是保证数据(注：配置数据，状态数据)在其管辖下的所有服务之间保持同步、一致。所以，我们可以认为Zookeeper是一个CP的分布式系统。所以他会牺牲可用性，也就是在极端环境下，ZooKeeper可能会丢弃一些请求，消费者程序需要重新请求才能获得结果。</span></p>
  <p data-lake-id="u68c196dd" id="u68c196dd"><span data-lake-id="ubecb9ce9" id="ubecb9ce9">​</span><br></p>
  <p data-lake-id="u5c986f6b" id="u5c986f6b"><span data-lake-id="u94c1d821" id="u94c1d821">而且， 作为ZooKeeper的核心实现算法 Zab，就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。</span></p>
  <p data-lake-id="u78980896" id="u78980896"><span data-lake-id="u34cfbcd7" id="u34cfbcd7">​</span><br></p>
  <p data-lake-id="uc236fbe4" id="uc236fbe4"><span data-lake-id="u03dc0f59" id="u03dc0f59">如果 ZooKeeper下所有节点都断开了，或者集群中出现了网络分割的故障(注：由于交换机故障导致交换机底下的子网间不能互访);那么ZooKeeper 会将它们都从自己管理范围中剔除出去，外界就不能访问到这些节点了，即便这些节点本身是“健康”的，可以正常提供服务的;所以导致到达这些节点的服务请求被丢失了。</span></p>
  <p data-lake-id="u5c99c87b" id="u5c99c87b"><span data-lake-id="ucc392ae0" id="ucc392ae0">​</span><br></p>
  <p data-lake-id="uc993fabe" id="uc993fabe"><strong><u><span data-lake-id="u1f5af67c" id="u1f5af67c">但是，请一定要注意，这里面的一致性，他确实是强一致性，但是，Zookeeper保证的是强一致模型中的顺序一致性而不是线性一致性。 </span></u></strong><span data-lake-id="u993bf8bf" id="u993bf8bf">（这个很少有人提）</span></p>
  <p data-lake-id="ub47bcd8c" id="ub47bcd8c"><span data-lake-id="udd6b5210" id="udd6b5210">​</span><br></p>
  <p data-lake-id="u02c8e780" id="u02c8e780"><br></p>
  <p data-lake-id="u10a88f5a" id="u10a88f5a"><span data-lake-id="uc72f3b89" id="uc72f3b89">这一点在ZK的官网（</span><a href="https://zookeeper.apache.org/doc/r3.4.13/zookeeperProgrammers.html" target="_blank" data-lake-id="u3057d5e1" id="u3057d5e1"><span data-lake-id="u3712a081" id="u3712a081">https://zookeeper.apache.org/doc/r3.4.13/zookeeperProgrammers.html</span></a><span data-lake-id="ua9622289" id="ua9622289"> ）上明确的说过：</span></p>
  <p data-lake-id="uda9cf5b4" id="uda9cf5b4"><span data-lake-id="ua5d3224e" id="ua5d3224e">​</span><br></p>
  <p data-lake-id="u3e99dfd5" id="u3e99dfd5"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1694089212043-6981241f-c56f-438a-9f55-daf4e61f52c1.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_67%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u88813203" id="u88813203"><br></p>
  <p data-lake-id="u6a8f9fbd" id="u6a8f9fbd"><span data-lake-id="ue2a48b1d" id="ue2a48b1d">这里明确的提了，Zookeeper是保证的顺序一致性，也就是说，ZooKeeper不保证在每个时间点，两个不同的客户端将具有相同的ZooKeeper数据视图。但是他能保证我们在每个节点上读取到的一定是他最后一次更新的内容。</span></p>
  <p data-lake-id="u2723f682" id="u2723f682"><span data-lake-id="udd41a95e" id="udd41a95e">​</span><br></p>
  <p data-lake-id="uc3966750" id="uc3966750"><span data-lake-id="uf47c7785" id="uf47c7785">具体的案例就是，当Zookeeper在进行数据同步的过程中，如果半数节点同步成功，它就提交当前事务，但此时集群内还有可能有节点没有同步到数据，如果此时读请求发送到没有同步到数据的节点，那么就会读到旧的数据。</span></p>
  <p data-lake-id="u0089e8b9" id="u0089e8b9"><span data-lake-id="ue811c590" id="ue811c590">​</span><br></p>
  <p data-lake-id="u8ddee103" id="u8ddee103"><span data-lake-id="u3a6463f7" id="u3a6463f7">但是Zookeeper是会保证这个节点最终也会按照顺序执行成功的。</span></p>
  <p data-lake-id="u8c704039" id="u8c704039"><span data-lake-id="u229292fa" id="u229292fa">​</span><br></p>
  <h1 data-lake-id="mwkCC" id="mwkCC"><span data-lake-id="ud5bb3106" id="ud5bb3106">扩展知识</span></h1>
  <p data-lake-id="u1997c4ed" id="u1997c4ed"><br></p>
  <h2 data-lake-id="bcVw4" id="bcVw4"><span data-lake-id="u73870383" id="u73870383">如何保证真正的强一致性？</span></h2>
  <p data-lake-id="u884f2c39" id="u884f2c39"><br></p>
  <p data-lake-id="u7fab825f" id="u7fab825f"><span data-lake-id="u3e28b718" id="u3e28b718">想要让Zookeeper真正的保证强一致性，或者说保证线性一致性也是有办法的，那就是通过sync命令。</span></p>
  <p data-lake-id="ufb80f27c" id="ufb80f27c"><span data-lake-id="ubba003f2" id="ubba003f2">​</span><br></p>
  <p data-lake-id="u874d48af" id="u874d48af"><span data-lake-id="u16896831" id="u16896831">当我们对一个Follower调用sync命令的时候，会使得他和Leader节点进行数据同步，并等待服务器同步完成之后再返回。这样下一次的read就能保证拿到的是最新数据了。</span></p>
 </body>
</html>